 

import de.htw.saarland.stl.*;

/**
 * Testklasse zum testen der Methoden der Klasse Math
 * 
 * @author Andreas Schreiner
 * @version 2
 */

public class MathDialog
{
    private static final int BEENDEN     = 0;
    private static final int TEILERMENGE = 1;
    private static final int PRIMZAHL    = 2;
    private static final int QUADRATISCH = 3;
    private static final int TRIPEL = 4;
    private static final int SUMME = 5;
    private static final int CLEAR = 6;
    private static int test;
    private static int varClear = 0;
    private static String strClear = " Clear aktivieren\n";

    /**
     * Hauptmethode der MathTest Klasse, die ein neues Objekt MathTest erstellt mit dem gearbeitet wird
     */
    public static  void main(String[] args)
    {
        MathDialog m1 = new MathDialog();
        m1.start();
    }

    /**
     * Einlese-Funktion des Menues, zur weiteren Verarbeitung, je nachdem welchen Menuepunkt der
     * User gewaehlt hat.
     * 
     * @return Gibt aus welche Funktion der Benutzer gewaehlt hat
     */
    private int einlesenFunktion()
    {
        System.out.println(TEILERMENGE + 
        	" Teilermenge\n" + 
            PRIMZAHL + 
            " Primzahl\n" + 
            QUADRATISCH +
            " Quadratische Gleichung (a0x2 + a1x + a2)\n" +
            TRIPEL +
            " Tripelberechnung (a0^3 + a1^3 = a2^2)\n" +
            SUMME +
            " Summenfunktion\n" +
            CLEAR + 
            strClear +
            BEENDEN + 
            " Beenden\n"); 
        return Stdin.readlnInt("Menuepunkt waehlen:");
    }

    /**
     * Try-Catch Methode zum Auffangen von Error und Exception, damit das Programm nicht sofort
     * beendet wird.
     * 
     * @param funktion Der eingegebene Menuewert zwischen 0 und 4, der, solange er ungleich 0 ist das Programm weiterlaufen l������sst.
     */
    public void start()
    {
        int funktion = -1;
        while (funktion != 0)
        {
            try
            {
                funktion = einlesenFunktion();
                if ( varClear == 1)
                {
                    Runtime.getRuntime().exec("clear");
                }
                ausfuehrenFunktion(funktion);
            }
            catch(AssertionError e)
            {
                System.out.println(e);
            }
            catch (Exception e)
            {
                System.out.println(e);
                e.printStackTrace();
            }
        }
    }

    /**
     * Wurde ein Menuepunkt gewaehlt wird hier ueber die entsprechende case-Verzweigung im switch-Befehl die passende Berechnung ausgewaehlt und die benoetigten Werte werden
     * abgefragt.
     * 
     * Bei jeder Werteabfrage wird geprueft, ob die Eingabe des Benutzers auch zulaessig ist.
     * 
     * @param numT Bestaetigungsvariable, die die Schleife beendet wenn sie fuer die gesamte Funktion der Teilermenge inklusive Fehlerabfaenger durchgelaufen ist.
     * @param numP Bestaetigungsvariable, die die Schleife beendet wenn sie fuer die gesamte Funktion der Primzahl inklusive Fehlerabfaenger durchgelaufen ist.
     * @param numQ Bestaetigungsvariable, die die Schleife beendet wenn sie fuer die gesamte Funktion der Quadratischen Gleichung inklusive Fehlerabfaenger durchgelaufen ist.
     */
    
    public void ausfuehrenFunktion(int funktion)
    {
        switch(funktion)
        {

            case BEENDEN:
            System.out.println("Programm Ende");
            break;

            case TEILERMENGE:
            int numT = 0;
            while( numT == 0)
            {

                try
                {

                    Teiler.teilermengenZahl = Stdin.readlnInt("Von welcher Zahl soll die Teilermenge bestimmt werden?\n-->:");
                    Teiler.Teilermenge();
                    System.out.println("-->: " + Teiler.ergebniss +'\n');
                    numT = 1;
                }
                catch(AssertionError e)
                {
                    System.out.println(e);
                }
                catch (Exception e)
                {
                    System.out.println(e);
                    e.printStackTrace();
                }  
            }
            break;

            case PRIMZAHL:
            int numP = 0;
            while( numP == 0)
            {

                try
                {

                    Prim.primZahl = Stdin.readlnInt("Welche Zahl soll auf eine Primzahl geprueft werden? \n-->:");
                    Prim.strPrim(); 
                    System.out.println("-->: " + Prim.strErgebniss + '\n');
                    numP = 1;
                }
                catch(AssertionError e)
                {
                    System.out.println(e);
                }
                catch (Exception e)
                {
                    System.out.println(e);
                    e.printStackTrace();
                }

            }
            break;

            case QUADRATISCH:
            int numQ0 = 0;
            int numQ1 = 0;
            while( numQ0 == 0)
            {

                try{
                    System.out.print("Bitte a0, a1, a2 eingeben\n");
                    Quadr.quadrA = Stdin.readlnDouble("a0= ");
                    assert Quadr.quadrA != 0;
                    while (numQ1 == 0)
                    {
                        try
                        {
                            Quadr.quadrB = Stdin.readlnDouble("a1= ");
                            test = (int)Quadr.quadrC + 1;
                            numQ1 = 1;
                        }
                        catch(AssertionError e)
                        {
                            System.out.println(e);
                        }
                        catch (Exception e)
                        {
                            System.out.println(e);
                            e.printStackTrace();
                        }
                    }
                    while(numQ0 ==0)
                    {
                        try{
                            Quadr.quadrC = Stdin.readlnDouble("a2= ");
                            test = (int)Quadr.quadrC + 1;
                            Quadr.QuadratischeFunct();                                        
                            System.out.println("-->" + Quadr.ausgabe + '\n');
                            numQ0 = 1;
                        }
                        catch(AssertionError e)
                        {
                            System.out.println(e);
                        }
                        catch (Exception e)
                        {
                            System.out.println(e);
                            e.printStackTrace();
                        }

                    }
                }
                catch(AssertionError e)
                {
                    System.out.println(e);
                }
                catch (Exception e)
                {
                    System.out.println(e);
                    e.printStackTrace();
                }  
            }            
            break;
            
            case TRIPEL:
            {
            	int numT0 = 0;
            	while(numT0 == 0)
                {
                    try{
                    	Zahlentripel.tripelMAX = Stdin.readlnInt("Obere Schranke: ");
                        test = Zahlentripel.tripelMAX + 1;
                        Zahlentripel.Tripel();                                        
                        System.out.println('\n' + Zahlentripel.strAusgabe);
                        numT0 = 1;
                    }
                    catch(AssertionError e)
                    {
                        System.out.println(e);
                    }
                    catch (Exception e)
                    {
                        System.out.println(e);
                        e.printStackTrace();
                    }

                }
            	break;
            }  
            case SUMME:
            {
            	int numS0 = 0;
            	while(numS0 == 0)
                {
                    try{
                    	Summe.summeX = Stdin.readlnInt("X: ");
                    	test = (int)Summe.summeX + 1;
                    	Summe.schranke = Stdin.readlnInt("Obere Schranke: ");
                        test = (int)Summe.schranke + 1;
                        Summe.SummenRechnung();                                        
                        System.out.println('\n' + Summe.summeRechnung + '\n');
                        numS0 = 1;
                    }
                    catch(AssertionError e)
                    {
                        System.out.println(e);
                    }
                    catch (Exception e)
                    {
                        System.out.println(e);
                        e.printStackTrace();
                    }

                }
            	break;
            }
            case CLEAR: 
            {
                        if (varClear == 1)
                        {
                            varClear = 0;
                            strClear = " Clear aktivieren\n";
                        }
                        else
                        {
                        	varClear = 1;
                        	strClear = " Clear deaktivieren\n";
                        }
                        break;
            }
            
            default:
            System.out.println("Falsche Eingabe!");
            break;
        }
    }
}